﻿using OfficeOpenXml;
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Linq;

namespace ScoreGen
{
	class Program
	{
		static void Main(string[] args)
		{
			//PrepareScore();
			ScoreGen();
		}

		public static void ScoreGen()
		{
			Console.WriteLine("Starting generate score data ......");
			
			var rootPath = @"F:\坚果云盘\教学\岩土教研室\研究生复试\2018级岩土\复试记录表";
			var sourceFile = "土木工程7组(岩土1).xlsx";

			var sourceData = new List<string[]>();
			using (var excel = new ExcelPackage(new FileInfo(Path.Combine(rootPath, sourceFile))))
			{
				var sheet = excel.Workbook.Worksheets["土木7组(岩土1)"];
				const int colCount = 28;
				int rowStart = 4;
				var row = rowStart;
				var totalRow = 0;
				while (true)
				{
					if (string.IsNullOrWhiteSpace(sheet.Cells[row, 1].GetValue<string>()))
						break;

					sourceData.Add(new string[colCount]);
					for (var col = 1; col <= colCount; col++)
					{
						sourceData[totalRow][col - 1] = sheet.Cells[row, col].GetValue<string>()?.Trim()??"";
						Debug.Assert(sourceData[totalRow][col - 1] != null);
					}

					row++;
					totalRow++;
				}
			}

			string ConvertBirthDay(string birthDay)
			{
				Debug.Assert(!string.IsNullOrWhiteSpace(birthDay) && birthDay.Length == 8);
				var year = int.Parse(birthDay.Substring(0, 4));
				var month = int.Parse(birthDay.Substring(4, 2));
				var day = int.Parse(birthDay.Substring(6, 2));
				return $"{year}年{month}月{day}日";
			}

			string GetTestName(string testDescription)
				=> string.IsNullOrWhiteSpace(testDescription)
					? ""
					: testDescription.Substring(0, testDescription.Length - 2);

			string GetTestScore(string testDescription)
				=> string.IsNullOrWhiteSpace(testDescription)
					? ""
					: testDescription.Substring(testDescription.Length - 2, 2);

			string GetEnglishAssessment(string score)
			{
				Debug.Assert(!string.IsNullOrWhiteSpace(score));

				var comments = new[]
				{
					"考生能够能清楚全面的回答问题，发音清晰准确，没有语法错误，语言表达流畅自然。",
					"考生能够较好的运用英语进行自我介绍，发音较为正确，口头表达较为流利，具有较好的英语运用能力。",
					"能大概回答问题，思路较为清晰，发音较为准确，有个别语法错误，能基本运用英语陈述。",
					"不能准确回答问题，答题时思路不够清晰到位，发音不够准确，有一些语法错误，语言表达基本流畅。",
				};

				var s = double.Parse(score);
				if (s >= 90)
					return comments[0];
				else if (s >= 80)
					return comments[1];
				else if (s >= 70)
					return comments[2];
				else 
					return comments[3];
			}

			string GetInterviewAssessment(string score)
			{
				Debug.Assert(!string.IsNullOrWhiteSpace(score));

				var comments = new[]
				{
					"考生精神面貌良好，注重仪容。面试中，对考官提出的问题能够很好的进行思考和回答，思路较为清晰，土木工程专业基础知识掌握较扎实。",
					"考生言行举止符合一般礼节，无多余动作。面试中，对考官提出的问题能够较好的进行思考和回答，土木工程专业基础知识掌握较好，对岩土工程领域的研究情况有一定的了解。考生思路还算清楚，具有较好的语言组织能力和逻辑判断能力。",
					"考生精神面貌良好，无多余动作。面试中，对考官提出的问题能够基本回答到位，土木工程专业基础知识掌握一般，对岩土工程领域的研究情况有些许的了解。考生思路较为清晰，表达基本顺畅，对部分问题回答仍有不足，具有较好的语言表达能力。",
					"考生精神面貌良好。面试中，对考官提出的问题不能回答到位，土木工程专业基础知识掌握较差，对岩土工程领域的研究情况不甚了解。考生思路不是很清晰，对大部分问题回答不上来，还有较大的提升空间。",
				};

				var s = double.Parse(score);
				if (s >= 90)
					return comments[0];
				else if (s >= 80)
					return comments[1];
				else if (s >= 70)
					return comments[2];
				else
					return comments[3];
			}

			var templateFile = "复试记录表模板.xlsx";
			foreach (var rowData in sourceData)
			{
				var id = int.Parse(rowData[1 - 1]);		// 序号
				var name = rowData[3-1];			// 姓名
				var sourceType = rowData[7 - 1];	// 考生来源

				var destFile = $"复试记录表_{id:D2}_{name}.xlsx";
				var destFilePath = Path.Combine(rootPath, "复试记录表", destFile);
				File.Copy(Path.Combine(rootPath, templateFile), destFilePath, true);
				Debug.Assert(File.Exists(destFilePath));

				using (var excel = new ExcelPackage(new FileInfo(destFilePath)))
				{
					var sheet = excel.Workbook.Worksheets[1];

					sheet.Cells[5, 2].Value = rowData[3 - 1];     // 姓名
					sheet.Cells[5, 4].Value = rowData[5 - 1];     // 性别
					sheet.Cells[5, 6].Value = rowData[4 - 1];     // 民族
					sheet.Cells[5, 8].Value = ConvertBirthDay(rowData[6 - 1]);     // 出生日期
					sheet.Cells[6, 2].Value = rowData[2 - 1];     // 考生编号
					sheet.Cells[9, 3].Value = rowData[21 - 1];     // 笔试
					sheet.Cells[10, 3].Value = $"{double.Parse(rowData[25 - 1]):F1}";     // 面试
					sheet.Cells[11, 3].Value = rowData[24 - 1];     // 外语
					sheet.Cells[9, 4].Value = rowData[26 - 1];     // 复试成绩
					sheet.Cells[9, 7].Value = GetTestName(rowData[22 - 1]);      // 加试科目一名称
					sheet.Cells[10, 7].Value = GetTestScore(rowData[22 - 1]);     // 加试科目一成绩
					sheet.Cells[11, 7].Value = GetTestName(rowData[23 - 1]);     // 加试科目二名称
					sheet.Cells[12, 7].Value = GetTestScore(rowData[23 - 1]);     // 加试科目二成绩
					sheet.Cells[15, 8].Value = $"{double.Parse(rowData[27 - 1]):F1}";     // 总成绩
					sheet.Cells[16, 2].Value = GetEnglishAssessment(rowData[24 - 1]);     // 外语能力
					sheet.Cells[18, 2].Value = GetInterviewAssessment(rowData[25 - 1]);     // 面试评语

					if (sourceType == "一志愿")
					{
						sheet.Cells[7, 7].Value = "初试总分(500分)/5";     // 计算公式
						sheet.Cells[8, 7].Value = $"{double.Parse(rowData[19 - 1]) / 5d:F1}"; // 初试成绩(百分制)
					}
					else
					{
						sheet.Cells[7, 7].Value = "统考总分(350分)/3.5";     // 计算公式
						sheet.Cells[8, 7].Value = $"{double.Parse(rowData[19 - 1]) / 3.5:F1}"; // 初试成绩(百分制)
					}

					excel.Save();
				}
			}

			Console.WriteLine("Done!");
			Console.ReadKey();
		}

		public static void PrepareScore()
		{
			Console.WriteLine("Starting prepare score data ......");

			var rootPath = @"F:\坚果云盘\教学\岩土教研室\研究生复试\2018级岩土\复试记录表";
			var sourceFile = "土木学院2018年研究生复试结果汇总表.xlsx";
			var destFile = "土木工程7组(岩土1).xlsx";

			var sourceData = new List<string[]>();
			using (var excel = new ExcelPackage(new FileInfo(Path.Combine(rootPath, sourceFile))))
			{
				var sheet = excel.Workbook.Worksheets["建筑与土木工程专硕"];
				const int colCount = 19;
				int rowStart = 4;
				var row = rowStart;
				var totalRow = 0;
				while (true)
				{
					if (string.IsNullOrWhiteSpace(sheet.Cells[row, 1].GetValue<string>()))
						break;

					sourceData.Add(new string[colCount]);
					for (var col = 1; col <= colCount; col++)
					{
						sourceData[totalRow][col-1] = sheet.Cells[row, col].GetValue<string>();
					}

					row++;
					totalRow++;
				}

				sheet = excel.Workbook.Worksheets["土木工程学硕"];
				rowStart = 4;
				row = rowStart;
				while (true)
				{
					if (string.IsNullOrWhiteSpace(sheet.Cells[row, 1].GetValue<string>()))
						break;

					sourceData.Add(new string[colCount]);
					for (var col = 1; col <= colCount; col++)
					{
						sourceData[totalRow][col - 1] = sheet.Cells[row, col].GetValue<string>();
					}

					row++;
					totalRow++;
				}
			}

			using (var excel = new ExcelPackage(new FileInfo(Path.Combine(rootPath, destFile))))
			{
				var sheet = excel.Workbook.Worksheets["土木7组(岩土1)"];
				var row = 4;
				while (true)
				{
					if (string.IsNullOrWhiteSpace(sheet.Cells[row, 1].GetValue<string>()))
						break;

					var name = sheet.Cells[row, 3].GetValue<string>().Trim();
					var rowData = sourceData.First(d => d[0].Trim() == name);
					Debug.Assert(rowData != null);
					sheet.Cells[row, 19].Value = rowData[9 - 1]; // 初试总分
					sheet.Cells[row, 21].Value = rowData[10 - 1]; // 笔试成绩
					sheet.Cells[row, 22].Value = rowData[17 - 1]; // 加试一
					sheet.Cells[row, 23].Value = rowData[18 - 1]; // 加试二
					sheet.Cells[row, 24].Value = rowData[11 - 1]; // 外语面试
					sheet.Cells[row, 25].Value = rowData[12 - 1]; // 综合面试
					sheet.Cells[row, 26].Value = rowData[13 - 1]; // 复试总分
					sheet.Cells[row, 27].Value = rowData[14 - 1]; // 总成绩
					sheet.Cells[row, 28].Value = rowData[19 - 1]; // 备注

					row++;
				}

				excel.Save();
			}

			Console.WriteLine("Done!");
			Console.ReadKey();
		}
	}
}